﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<iostream>
// 问题：下面代码的结果是什么？
//int main()
//{
//	const char* pa = "abc";
//	const char* pb = "abc";
//	printf("%p\n%p\n%p\n", "abc", pa, pb);// 00007FF7E807AC24
//										  // 00007FF7E807AC24
//										  // 00007FF7E807AC24
//	return 0; 
//}
//可以发现，VS2022中，常量字符串和赋为该值的指针指向的地址是相同的（这种将地址合并的行为取决于编译器）

//引申：
int main()
{
	//char* pc = "abc";//会报错，"abc"是常量字符串，内存中会开辟一块不可更改的空间来存放该字符串，因此指针类型应加const

	//但开辟空间来存储是字符串的特权，面对其他类型（如整形），是不会单独开辟空间的，而是直接转换成二进制
	//const int* pd = 30;//因此，对于整形指针，即使加了const也会报错

	//可是，C++的引用语法+const，尽管引用的底层也是指针，却可以做到将整型常量取别名的操作
	const int& e = 30;
	std::cout << e << std::endl;//30\n
	//  究其原因，是因为引用绑定是语法糖​​：
	//  const int& a = 30 实际上是编译器完成了以下步骤：
	//	隐式创建临时变量 __tmp（const int __tmp = 30; ）。
	//	将引用 a 绑定到 __tmp。
	//	​​但指针没有这种隐式转换​​，必须显式提供地址。
	return 0;
}


//解释：
//​语法糖（Syntactic Sugar）​​ 是编程语言中的一个术语，
//指那些​​为了让代码更易写、易读而设计的语法特性​​，它们并不会引入新功能，
//只是提供更简洁的表达方式。可以理解为“语法上的甜头”
//——让程序员写代码时更“甜”、更舒服。